package net.sinodata.smartframework.threadpool.thread;

import net.sinodata.smartframework.component.SpringContext;
import net.sinodata.smartframework.threadpool.base.AbstractThreadPool;
import net.sinodata.smartframework.threadpool.processor.Test01Processor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Description: Test01线程池类
 * 
 * @author: yinliangyun
 * @date: 2021-5-19
 */

//代码层面来看属于线程不断运行--->线程对线程池状态判断、然后将任务提交给线程池处理，线程池处理后，线程继续执行判断
public class Test01ThreadPool extends AbstractThreadPool {

	private static final Logger logger = LoggerFactory.getLogger(Test01ThreadPool.class);

	/**
	 * 运行方法，控制线程池的执行逻辑
	 */
	public void run() {
		try {
			Thread.sleep(20 * 1000);
		} catch (InterruptedException e) {
			// 如果线程被中断，记录日志并结束方法执行
			logger.info("队列线程池终止,队列名称:" + getThreadPoolName());
			return;
		}
		// 如果线程被中断，记录日志并结束方法执行
		while (isWorkState()) {
			// 如果线程池当前很忙
			if (this.isBusy()) {
				try {
					// 休眠一段时间后再次尝试
					Thread.sleep(getSleepTime() * 1000);
				} catch (InterruptedException e) {
					// 如果线程被中断，跳出循环
					break;
				}
				continue;
			}

			// 如果当前时间不在允许的执行时间内
			if (!isRunTime()) {
				// 记录日志并休眠一段时间后再次尝试
				logger.info("不在执行时间范围内，开始时间：" + this.getRunStartTime() + ",结束时间：" + this.getRunEndTime());
				try {
					Thread.sleep(getSleepTime() * 1000);
				} catch (InterruptedException e) {
					// 如果线程被中断，跳出循环
					break;
				}
				continue;
			}

			// 休眠一段时间，可能是为了降低CPU占用
			try {
				Thread.sleep(getSleepTime() * 10000);
				logger.info("sleep 10000");
			} catch (InterruptedException e) {
				// 如果线程被中断，记录错误日志
				logger.error("InterruptedException", e);
			}

			// 获取任务处理器实例
			Test01Processor processor = (Test01Processor) SpringContext.getBean("test01Processor");

			// 创建一个可运行任务
			Runnable t = new Runnable() {
				public void run() {
					try {
						// 记录任务开始时间
						long processstart = System.currentTimeMillis();
						// 执行任务处理
						processor.processTask(getThreadPoolName() + "_" + processstart);
						// 记录任务结束时间
						long processsend = System.currentTimeMillis();
						// 记录任务执行耗时
						logger.info("耗时：" + (processsend - processstart) + "ms ");
					} catch (Throwable e) {
						// 如果任务执行失败，记录错误日志
						logger.error("失败", e);
					}
				}
			};
			// 将任务提交至线程池处理
			this.execute(t);
		}

		// 当线程池不再工作时，记录日志
		logger.info("队列线程池终止,队列名称:" + getThreadPoolName());
	}
}
